package org.apache.lucene.util;

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @lucene.internal
 */
public final class English {

    private English() {
    } // no instance

    public static String longToEnglish(long i) {
        StringBuilder result = new StringBuilder();
        longToEnglish(i, result);
        return result.toString();
    }

    public static void longToEnglish(long i, StringBuilder result) {
        if (i == 0) {
            result.append("zero");
            return;
        }
        if (i < 0) {
            result.append("minus ");
            i = -i;
        }
        if (i >= 1000000000000000000l) { // quadrillion
            longToEnglish(i / 1000000000000000000l, result);
            result.append("quintillion, ");
            i = i % 1000000000000000000l;
        }
        if (i >= 1000000000000000l) { // quadrillion
            longToEnglish(i / 1000000000000000l, result);
            result.append("quadrillion, ");
            i = i % 1000000000000000l;
        }
        if (i >= 1000000000000l) { // trillions
            longToEnglish(i / 1000000000000l, result);
            result.append("trillion, ");
            i = i % 1000000000000l;
        }
        if (i >= 1000000000) { // billions
            longToEnglish(i / 1000000000, result);
            result.append("billion, ");
            i = i % 1000000000;
        }
        if (i >= 1000000) { // millions
            longToEnglish(i / 1000000, result);
            result.append("million, ");
            i = i % 1000000;
        }
        if (i >= 1000) { // thousands
            longToEnglish(i / 1000, result);
            result.append("thousand, ");
            i = i % 1000;
        }
        if (i >= 100) { // hundreds
            longToEnglish(i / 100, result);
            result.append("hundred ");
            i = i % 100;
        }
        //we know we are smaller here so we can cast
        if (i >= 20) {
            switch (((int) i) / 10) {
                case 9:
                    result.append("ninety");
                    break;
                case 8:
                    result.append("eighty");
                    break;
                case 7:
                    result.append("seventy");
                    break;
                case 6:
                    result.append("sixty");
                    break;
                case 5:
                    result.append("fifty");
                    break;
                case 4:
                    result.append("forty");
                    break;
                case 3:
                    result.append("thirty");
                    break;
                case 2:
                    result.append("twenty");
                    break;
            }
            i = i % 10;
            if (i == 0)
                result.append(" ");
            else
                result.append("-");
        }
        switch ((int) i) {
            case 19:
                result.append("nineteen ");
                break;
            case 18:
                result.append("eighteen ");
                break;
            case 17:
                result.append("seventeen ");
                break;
            case 16:
                result.append("sixteen ");
                break;
            case 15:
                result.append("fifteen ");
                break;
            case 14:
                result.append("fourteen ");
                break;
            case 13:
                result.append("thirteen ");
                break;
            case 12:
                result.append("twelve ");
                break;
            case 11:
                result.append("eleven ");
                break;
            case 10:
                result.append("ten ");
                break;
            case 9:
                result.append("nine ");
                break;
            case 8:
                result.append("eight ");
                break;
            case 7:
                result.append("seven ");
                break;
            case 6:
                result.append("six ");
                break;
            case 5:
                result.append("five ");
                break;
            case 4:
                result.append("four ");
                break;
            case 3:
                result.append("three ");
                break;
            case 2:
                result.append("two ");
                break;
            case 1:
                result.append("one ");
                break;
            case 0:
                result.append("");
                break;
        }
    }

    public static String intToEnglish(int i) {
        StringBuilder result = new StringBuilder();
        longToEnglish(i, result);
        return result.toString();
    }

    public static void intToEnglish(int i, StringBuilder result) {
        longToEnglish(i, result);
    }

    public static void main(String[] args) {
        System.out.println(longToEnglish(Long.parseLong(args[0])));
    }

}
